#include <stdio.h>
#include <stdarg.h>
// extern 说明符 可以声明外部变量，全局函数可以调用
extern int const2;
extern int ggboom;

// extern 只能定义一次，可以声明多次
extern int foo(int arg1, char arg2); // 定义
// 函数
int plus_one(int x)
{
    return x + 3;
}
void Swap(int *x, int *y)
{
    &x = 3;
    &y = 3;
}

// extern 函数处理
int externFunc(int *d, int *h)
{
    &d = 33;
    &h = 99;
}
// 参数的传值引用;
int functionParams(int ma)
{
    return ma + 1;
}
// static 说明符
void counter(void)
{
    static int count = 1; // 只初始化一次 起到保存执行结果作用：
    printf("count等于：%d\n", count);
    count++;
}
// const 说明符
// void fsss(int *p)
// {
//     printf("无const说明符：%d\n");
// }
// void fsssss(const int *pp)
// {
//     *pp = 0; // 有const 情况下，更改参数变量 报错。
//     printf("const说明符：%d\n");
// }
int main()
{
    // counter();
    // counter();
    // counter();
    // counter();

    // const 说明符
    // fsssss(99);

    // const2 = 3;
    // ggboom = 3;
    // externFunc(&const2, &ggboom);
    // printf("extern的输出值：%d\n", const2, ggboom);
    int s = plus_one(3);
    printf("%d\n", s);

    int a = 1;
    int b = 2;
    Swap(&a, &b);
    printf("%d\n", a);
    printf("%d\n", b);

    int i = 10;
    functionParams(i);
    printf("传参的值为：%d\n", i);

    return 0;
}

// 函数指针;
void print(int a)
{
    printf("%d\n", a);
}
void (*print_prt)(int) = &print;
// (*print_ptr)(10);
// 等同于
print(10);

if (print == &print) // true

    void (*print_ptr)(int) = &print;

// void (*print_ptr)(int) = print;
if (print_ptr == print) // true

    // 写法一
    print(10)

        // 写法二
        (*print)(10)

        // 写法三
        (&print)(10)

        // 写法四
        (*print_ptr)(10)

        // 写法五
        print_ptr(10)

            int compute(int (*myfunc)(int), int, int);

void func1(void)
{
}
int main(void)
{
    func1();
    func2();
    return 0;
}

int twice(int);

int main(int num)
{
    return twice(num);
}

// 函数传参
int twice(int num)
{
    return 2 * num;
}

int twice(int num);

// exit 声明多次定义一次
// success 这个函数通过运行
// exit(EXIT_SUCCESS);

// 程序异常中止
// exit(EXIT_FAILURE);

// atexit 传入函数指针的定义
// atexit 声明多次，这里可以传入函数指针
int atexit(void (*func)(void))

    void print(void)
{
    printf("something wrong!\n");
}

// atexit(print);
// exit(EXIT_FAILURE);

// const
void f(int *pppppp)
{
    // 这里的P变量可以修改
    *pppppp = 20;
}

void f(const int *ppppppppppppp)
{
    // *ppppppppppppp = 0; // 改行报错
}

// 如果限制变量的值，或者变量指针 使用 两个const 修饰
void f(const int *const p)
{
    // ...
}

int printf(const char *format, ...);

// double average(int i, ...)
// {
//     double total = 0;
//     va_list ap;
//     va_start(ap, i);
//     for (int j = 1; j <= i; ++j)
//     {
//         total += va_arg(ap, double);
//     }
//     va_end(ap);
//     return total / i;
// }

double average(int i, ...)
{
    double total = 0;
    
    va_list ap;
    va_start(ap, i);
    for (int j = 0; j <= i; ++j)
    {
        total += va_arg(ap, double);
        /* code */
    }
    va_end(ap);
    return total / i;
}

// 